#include<bits/stdc++.h>
#define ll long long
#define mid ((l+r)>>1)
using namespace std;
namespace IO{
    char buff[1<<21],*p1=buff,*p2=buff;
    char getch(){
        return p1==p2&&(p2=((p1=buff)+fread(buff,1,1<<21,stdin)),p1==p2)?EOF:*p1++;
    }
    template<typename T>
    void read(T &x){
        char ch=getch();int fl=1;x=0;
        while(ch>'9'||ch<'0'){if(ch=='-')fl=-1;ch=getch();}
        while(ch<='9'&&ch>='0'){x=x*10+ch-48;ch=getch();}
        x*=fl;
    }
    template<typename T,typename ...Args>
    void read(T &x,Args& ...args){
        read(x);read(args...);
    }
    char obuf[1<<21],*p3=obuf;
    void putch(char ch){
        if(p3-obuf<(1<<21))*p3++=ch;
        else fwrite(obuf,p3-obuf,1,stdout),p3=obuf,*p3++=ch;
    }
    void pc(const char *s){
    	while(*s)putch(*s),s++;
    }
    char ch[100];
    template<typename T>
    void write(T x){
        if(!x)return putch('0');
        if(x<0)putch('-'),x*=-1;
        int top=0;
        while(x)ch[++top]=x%10+48,x/=10;
        while(top)putch(ch[top]),top--;
    }
    template<typename T,typename ...Args>
    void write(T x,Args ...args){
        write(x),putch(' '),write(args...);
    }
    void flush(){fwrite(obuf,p3-obuf,1,stdout);}
}
using namespace IO;
const int mod=1e9+7;
inline int Mod(int x){return x>=mod?x-mod:x;}
#define Get(S,i) (((S)>>(i))&1)
int n,m,k;
int _s[20],tmp[20];
int calc(int s){
	for(int i=0;i<m;i++)_s[i]=Get(s,i);
	int w=1;
	while(w<m&&_s[w]==_s[0])w++;
	if(_s[0]==1){for(int i=0;i<w;i++)tmp[i]=(1<<i)*(i+1);}
	else {for(int i=0;i<w;i++)tmp[i]=-(1<<i)*(i+1);}
	for(int i=w;i<m;i++){
		tmp[i]=tmp[i-1];
		for(int j=i-1,k=2;j;j--,k<<=1){
			if(_s[j]!=_s[i]){
				tmp[i]+=k*tmp[j-1];
				break;
			}
		}
	}
	return tmp[m-1];
}
bool vis[((1<<12)*13)*24+5];
int f[13][((1<<12)*13)*24+5];
signed main(){
	freopen("game.in","r",stdin);
	freopen("game.out","w",stdout);
	read(n,m,k);
	vector<int>S;
	for(int i=0;i<(1<<m);i++)
		S.push_back(calc(i));
	sort(S.begin(),S.end());
	int sum=0;
	for(int i=1;i<=k;i++){
		int s=0;
		for(int j=0;j<m;j++){
			char ch=getch();
			while(ch!='N'&&ch!='C')ch=getch();
			s+=((ch=='N')<<j);
		}
		sum+=calc(s); 
	}
	int _=m*(1<<(m-1));
	vector<int>last,nxt;
	f[k][sum+_]=1;
	last.push_back(sum+_);
	int asd,y; 
	for(int i=k+1;i<=n;i++){
		for(int x:last){
			asd=f[i-1][x];
			for(int j:S){
				y=x+j;
				if(max(y-_,_-y)>21024)continue;
				if(!vis[y])vis[y]=1,nxt.push_back(y);
				f[i][y]=Mod(f[i][y]+asd);
			}
		}
		swap(last,nxt);nxt.clear();
		for(int x:last)vis[x]=0;
	}
	for(int i=k;i<=n;i++)write(f[i][_]),putch(' ');
	return flush(),0;
}

